<?php
// $Id: global.func.php 207 2012-03-14 09:52:26Z tomqin@gmail.com $

/**
 *  global.func.php 公共函数库
 *
 * @copyright       Copyright (C) 2010-2012 ARESCMS Inc.
 * @author          TomQin <tomqin@gmail.com>
 * @license         http://www.arescms.cn/license/
 */

/**
 * 返回一个数组中的值
 *
 * @param array     数组
 * @param string    键值
 * @param mixed     默认值
 * @return mixed
 */
function array_get(array $array, $key, $default = null) {
    if(array_key_exists($key, $array)) {
        return $array[$key];
    }
    return $default;
}

/**
 * 返回一个数组中的字符串
 *
 * @param array     数组
 * @param string    键值
 * @param mixed     默认值
 * @return mixed
 */
function array_get_string(array $array, $key, $default = '') {
    return trim(isset($array[$key]) ? (string)$array[$key] : $default);
}

/**
 * 返回一个数组中的整型值
 *
 * @param array     数组
 * @param string    键值
 * @param integer   默认值
 * @return integer
 */
function array_get_int(array $array, $key, $default = 0) {
    return intval(isset($array[$key]) ? $array[$key] : $default);
}

/**
 * 返回一个数组中的浮点值
 *
 * @param array     数组
 * @param string    键值
 * @param integer   默认值
 * @return integer
 */
function array_get_double(array $array, $key, $default = 0) {
    return doubleval(isset($array[$key]) ? $array[$key] : $default);
}

/**
 * 返回一个数组中的长整型值
 *
 * @param array     数组
 * @param string    键值
 * @param integer   默认值
 * @return integer
 */
function array_get_long(array $array, $key, $default = 0){
    return sprintf('%u', array_get($array, $key, $default));
}

/**
 * 返回一个数组中的布尔判断值
 *
 * @param array     数组
 * @param string    键值
 * @param mixed     真值
 * @param mixed     假值
 * @return mixed
 */
function array_get_bool(array $array, $key, $true = 1, $false = 0){
    return (isset($array[$key])&&$array[$key]) ? $true : $false;
}

/**
 * 返回一个数组中在枚举范围内的值
 *
 * @param array     数组
 * @param string    键值
 * @param array     枚举数组
 * @param mixed     默认值
 * @return mixed
 */
function array_get_enum(array $array, $key, $enum, $default = ''){
    if(isset($array[$key])){
        return in_array($array[$key], $enum) ? $array[$key] : $default;
    }else{
        return $default;
    }
}

/**
 * 返回一个数组中在某一范围内的整数
 *
 * @param array     数组
 * @param string    键值
 * @param array     最小/大值的数组
 * @param integer   默认值
 * @return integer
 */
function array_get_range(array $array, $key, array $range, $default = 0){
    if(isset($array[$key])){
        $var = intval($array[$key]);
        list($min, $max) = $range;
        if($min > $max){
            $tmp = $min;
            $min = $max;
            $max = $tmp;
        }
        return ($var >= $min && $var <= $max) ? $var : $default;
    }else{
        return $default;
    }
}
/**
 * 返回一个数组中的符合模式匹配的字符串
 *
 * @param array     数组
 * @param string    键值
 * @param string    规则匹配
 * @param string    默认值
 * @return string
 */
function array_get_match(array $array, $key, $rule, $default){
    if(isset($array[$key])){
        return preg_match($rule, $array[$key]) ? $array[$key] : $default;
    }else{
        return $default;
    }
}
/**
 * Get extension name of the specified file.
 *
 * @param  string   file name
 * @return string
 */
function fileext($filename) {
    return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));
}
/**
 * 返回经addslashe处理过的字符串或数组
 *
 * @param string|array  需要处理的字符串或数组
 * @return mixed
 */
function h($string) {
    if(!is_array($string)) return htmlspecialchars($string);
    foreach($string as $key => $val) $string[$key] = h($val);
    return $string;
}
/**
 * 安全过滤函数
 *
 * @param $string
 * @return string
 */
function safe_replace($string) {
    $string = str_replace('%20','',$string);
    $string = str_replace('%27','',$string);
    $string = str_replace('%2527','',$string);
    $string = str_replace('*','',$string);
    $string = str_replace('"','&quot;',$string);
    $string = str_replace("'",'',$string);
    $string = str_replace('"','',$string);
    $string = str_replace(';','',$string);
    $string = str_replace('<','&lt;',$string);
    $string = str_replace('>','&gt;',$string);
    $string = str_replace("{",'',$string);
    $string = str_replace('}','',$string);
    return $string;
}
/**
 * 安全SQL查询字符串
 *
 * @param $string
 * @return string
 */
function safe_query($string) {
    $input = array('%','_','\'','"','\\','?','*','<','>','=','|');
    $string = str_replace($input,'',$string);
    return trim($string);
}

/**
 * 字符截取 支持UTF8/GBK
 * @param $string
 * @param $length
 * @param $dot
 */
function cutstr($string, $length, $dot = ' ...') {
    $strlen = iconv_strlen($string, CHARSET);
    if($strlen > $length){
        return iconv_substr($string, 0, $length, CHARSET) . $dot;
    }else{
        return $string;
    }
}

/**
 * 获取请求 IP
 *
 * @return string   IP地址
 */
function ip_address() {
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
}

/**
 * 产生随机字符串
 *
 * @param integer   输出长度
 * @param string    可选的 ，默认为 0123456789
 * @return string   字符串
 */
function random($length, $chars = '0123456789') {
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

/**
 * 生成随机字符串
 *
 * @param integer   长度
 * @return string   字符串
 */
function randomstr($lenth = 6) {
    return random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
}

/**
 * 将数组转换为字符串
 *
 * @param array     数组
 * @param boolean   如果为0，则不使用new_stripslashes处理，可选参数，默认为1
 * @return string   返回字符串，如果 data 为空，则返回空
 */
function array2string($data, $isformdata = 1) {
    if($data == '') return '';
    return var_export($data, true);
}

/**
 * 转换字节数为其他单位
 *
 * @param integer   字节大小
 * @return string   返回大小
 */
function convert_size($filesize) {
    if ($filesize >= 1073741824) {
        $filesize = floor ($filesize / 1073741824 * 100) / 100 .' GB';
    } elseif ($filesize >= 1048576) {
        $filesize = floor ($filesize / 1048576 * 100) / 100 .' MB';
    } elseif($filesize >= 1024) {
        $filesize = floor ($filesize / 1024 * 100) / 100 . ' KB';
    } else {
        $filesize = $filesize.' Bytes';
    }
    return $filesize;
}

/**
 * 返回内存使用量
 *
 * @return string
 */
function memory_usage() {
    return convert_size(memory_get_usage());
}

/**
 * 字符串加密、解密函数
 *
 * @param string    字符串
 * @param string    ENCODE为加密，DECODE为解密，可选参数，默认为ENCODE，
 * @param string    密钥：数字、字母、下划线
 * @return string
 */
function sys_auth($txt, $operation = 'ENCODE', $key = '') {
    $key  = $key ? $key : pc_base::load_config('system', 'auth_key');
    $txt  = $operation == 'ENCODE' ? (string)$txt : base64_decode($txt);
    $len  = strlen($key);
    $code = '';
    for($i=0; $i<strlen($txt); $i++){
        $k      = $i % $len;
        $code  .= $txt[$i] ^ $key[$k];
    }
    $code = $operation == 'DECODE' ? $code : base64_encode($code);
    return $code;
}

/**
 * 输出自定义错误
 *
 * @param $errno 错误号
 * @param $errstr 错误描述
 * @param $errfile 报错文件地址
 * @param $errline 错误行号
 * @return string 错误提示
 */
function my_error_handler($errno, $errstr, $errfile, $errline) {
    if($errno==8) return '';
    $errfile = str_replace(ARESCMS_PATH,'',$errfile);
    if(Config::get('system.errorlog')) {
        error_log('<?php exit;?>'.date('m-d H:i:s',TIMESTAMP).' | '.$errno.' | '.str_pad($errstr,30).' | '.$errfile.' | '.$errline."\r\n", 3, DATA_PATH.'error_log.php');
    } else {
        $str = '<div style="font-size:12px;text-align:left;border:1px solid #9cc9e0;border-top:none;padding:1px 4px;color:#000000;font-family:Arial, Helvetica,sans-serif;"><span><u>Error no</u>:' . $errno . ',str:' . $errstr . ',<u>File</u>:<font color="blue">' . $errfile . '</font>,line' . $errline .'<br /><a href="/?type=file&errno='.$errno.'&errstr='.urlencode($errstr).'&errfile='.urlencode($errfile).'&errline='.$errline.'" target="_blank" style="color:red">Need Help?</a></span></div>';
        echo $str;
    }
}

/**
 * 加载模板标签缓存
 * @param string $name 缓存名
 * @param integer $times 缓存时间
 */
function tpl_cache($name,$times = 0) {
    $filepath = 'tpl_data';
    $info = getcacheinfo($name, $filepath);
    if (SYS_TIME - $info['filemtime'] >= $times) {
        return false;
    } else {
        return getcache($name,$filepath);
    }
}

////////////////////////////////////////////////////////////////////////

/**
 * 写入缓存，默认为文件缓存，不加载缓存配置。
 * @param $name 缓存名称
 * @param $data 缓存数据
 * @param $filepath 数据路径（模块名称） caches/cache_$filepath/
 * @param $type 缓存类型[file,memcache,apc]
 * @param $config 配置名称
 * @param $timeout 过期时间
 */
function setcache($name, $data, $filepath='', $type='file', $config='', $timeout=0) {
    pc_base::load_sys_class('cache_factory','',0);
    if($config) {
        $cacheconfig = pc_base::load_config('cache');
        $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
    } else {
        $cache = cache_factory::get_instance()->get_cache($type);
    }

    return $cache->set($name, $data, $timeout, '', $filepath);
}

/**
 * 读取缓存，默认为文件缓存，不加载缓存配置。
 * @param string $name 缓存名称
 * @param $filepath 数据路径（模块名称） caches/cache_$filepath/
 * @param string $config 配置名称
 */
function getcache($name, $filepath='', $type='file', $config='') {
    pc_base::load_sys_class('cache_factory','',0);
    if($config) {
        $cacheconfig = pc_base::load_config('cache');
        $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
    } else {
        $cache = cache_factory::get_instance()->get_cache($type);
    }
    return $cache->get($name, '', '', $filepath);
}

/**
 * 删除缓存，默认为文件缓存，不加载缓存配置。
 * @param $name 缓存名称
 * @param $filepath 数据路径（模块名称） caches/cache_$filepath/
 * @param $type 缓存类型[file,memcache,apc]
 * @param $config 配置名称
 */
function delcache($name, $filepath='', $type='file', $config='') {
    pc_base::load_sys_class('cache_factory','',0);
    if($config) {
        $cacheconfig = pc_base::load_config('cache');
        $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
    } else {
        $cache = cache_factory::get_instance()->get_cache($type);
    }
    return $cache->delete($name, '', '', $filepath);
}

/**
 * 读取缓存，默认为文件缓存，不加载缓存配置。
 * @param string $name 缓存名称
 * @param $filepath 数据路径（模块名称） caches/cache_$filepath/
 * @param string $config 配置名称
 */
function getcacheinfo($name, $filepath='', $type='file', $config='') {
    pc_base::load_sys_class('cache_factory');
    if($config) {
        $cacheconfig = pc_base::load_config('cache');
        $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
    } else {
        $cache = cache_factory::get_instance()->get_cache($type);
    }
    return $cache->cacheinfo($name, '', '', $filepath);
}
/**
 * 判断email格式是否正确
 * @param $email
 */
function is_email($email) {
    return strlen($email) > 6 && preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $email);
}


/**
 * 判断字符串是否为utf8编码，英文和半角字符返回ture
 * @param $string
 * @return bool
 */
function is_utf8($string) {
    return preg_match('%^(?:
                    [\x09\x0A\x0D\x20-\x7E] # ASCII
                    | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
                    | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
                    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
                    | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
                    | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
                    )*$%xs', $string);
}


/**
 * 对用户的密码进行加密
 * @param $password
 * @param $encrypt //传入加密串，在修改密码时做认证
 * @return array/password
 */
function password($password, $encrypt='') {
    $pwd = array();
    $pwd['encrypt'] =  $encrypt ? $encrypt : create_randomstr();
    $pwd['password'] = md5(md5(trim($password)).$pwd['encrypt']);
    return $encrypt ? $pwd['password'] : $pwd;
}

/**
 * 当前路径
 * 返回指定栏目路径层级
 * @param $catid 栏目id
 * @param $symbol 栏目间隔符
 */
function catpos($catid, $symbol=' > '){
    $category_arr = array();
    $siteids = getcache('category_content','commons');
    $siteid = $siteids[$catid];
    $category_arr = getcache('category_content_'.$siteid,'commons');
    if(!isset($category_arr[$catid])) return '';
    $pos = '';
    $siteurl = siteurl($category_arr[$catid]['siteid']);
    $arrparentid = array_filter(explode(',', $category_arr[$catid]['arrparentid'].','.$catid));
    foreach($arrparentid as $catid) {
        $url = $category_arr[$catid]['url'];
        if(strpos($url, '://') === false) $url = $siteurl.$url;
        $pos .= '<a href="'.$url.'">'.$category_arr[$catid]['catname'].'</a>'.$symbol;
    }
    return $pos;
}

/**
 * 将附件地址转换为绝对地址
 * @param $path 附件地址
 */
function atturl($path) {
    if(strpos($path, ':/')) {
        return $path;
    } else {
        $sitelist = getcache('sitelist','commons');
        $siteid =  get_siteid();
        $siteurl = $sitelist[$siteid]['domain'];
        $domainlen = strlen($sitelist[$siteid]['domain'])-1;
        $path = $siteurl.$path;
        $path = substr_replace($path, '/', strpos($path, '//',$domainlen),2);
        return  $path;
    }
}

/**
 * 生成SEO
 * @param $siteid       站点ID
 * @param $catid        栏目ID
 * @param $title        标题
 * @param $description  描述
 * @param $keyword      关键词
 */
function seo($siteid, $catid = '', $title = '', $description = '', $keyword = '') {
    if (!empty($title))$title = strip_tags($title);
    if (!empty($description)) $description = strip_tags($description);
    if (!empty($keyword)) $keyword = str_replace(' ', ',', strip_tags($keyword));
    $sites = getcache('sitelist', 'commons');
    $site = $sites[$siteid];
    $cat = array();
    if (!empty($catid)) {
        $siteids = getcache('category_content','commons');
        $siteid = $siteids[$catid];
        $categorys = getcache('category_content_'.$siteid,'commons');
        $cat = $categorys[$catid];
        $cat['setting'] = string2array($cat['setting']);
    }
    $seo['site_title'] =isset($site['site_title']) && !empty($site['site_title']) ? $site['site_title'] : $site['name'];
    $seo['keyword'] = !empty($keyword) ? $keyword : $site['keywords'];
    $seo['description'] = isset($description) && !empty($description) ? $description : (isset($cat['setting']['meta_description']) && !empty($cat['setting']['meta_description']) ? $cat['setting']['meta_description'] : (isset($site['description']) && !empty($site['description']) ? $site['description'] : ''));
    $seo['title'] =  (isset($title) && !empty($title) ? $title.' - ' : '').(isset($cat['setting']['meta_title']) && !empty($cat['setting']['meta_title']) ? $cat['setting']['meta_title'].' - ' : (isset($cat['catname']) && !empty($cat['catname']) ? $cat['catname'].' - ' : ''));
    foreach ($seo as $k=>$v) {
        $seo[$k] = str_replace(array("\n","\r"),    '', $v);
    }
    return $seo;
}


/**
 * 文本转换为图片
 * @param string $txt 图形化文本内容
 * @param int $fonttype 无外部字体时生成文字大小，取值范围1-5
 * @param int $fontsize 引入外部字体时，字体大小
 * @param string $font 字体名称 字体请放于phpcms\libs\data\font下
 * @param string $fontcolor 字体颜色 十六进制形式 如FFFFFF,FF0000
 */
function string2img($txt, $fonttype = 5, $fontsize = 16, $font = '', $fontcolor = 'FF0000',$transparent = '1') {
    if(empty($txt)) return false;
    if(function_exists("imagepng")) {
        $txt = urlencode(sys_auth($txt));
        $txt = '<img src="'.APP_PATH.'api.php?op=creatimg&txt='.$txt.'&fonttype='.$fonttype.'&fontsize='.$fontsize.'&font='.$font.'&fontcolor='.$fontcolor.'&transparent='.$transparent.'" align="absmiddle">';
    }
    return $txt;
}

/**
 * 获取phpcms版本号
 */
function get_pc_version($type='') {
    $version = pc_base::load_config('version');
    if($type==1) {
        return $version['pc_version'];
    } elseif($type==2) {
        return $version['pc_release'];
    } else {
        return $version['pc_version'].' '.$version['pc_release'];
    }
}

function runtime() {
    return microtime(true) - SYS_START_TIME;
}
?>